package com.hechuan.interceptor;

import cn.hutool.core.util.ReflectUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;
import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor;
import com.hechuan.doman.User;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.session.RowBounds;

import java.util.HashMap;
import java.util.Map;

/**
 * 查询拦截器5
 * 演示如何获取sql传入的参数
 */
public class QueryInterceptor5 implements InnerInterceptor {

    /**
     * 获取sql传入的参数
     */
    @Override
    public void beforeQuery(Executor executor, MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, BoundSql boundSql) {
        // 原始sql：SELECT  id,name,age,address  FROM t_user WHERE (name = ? AND age = ?)
        String originSql = boundSql.getSql();
        System.out.println("originSql：" + originSql);

        // parameter，实际上它就是个Map对象
        Map parameterMap = (Map) parameter;
        // QueryWrapper，实际上就是 在 代码查询的地方创建的QueryWrapper。
        Object obj = parameterMap.get("ew");
        QueryWrapper queryWrapper = (QueryWrapper) obj;

        // 获取 设置的 entity 对象
        // 在 代码查询的地方 向 QueryWrapper中，设置的 entity。
        // 例如：queryWrapper.setEntity(new User()) 那么此处的 对象就是 User对象
        Object entity = queryWrapper.getEntity();
        User user = (User) entity;
        Long id = user.getId();
        String name = user.getName();
        System.out.println("id：" + id);
        System.out.println("name：" + name);

        // 获取 通过 queryWrapper.eq()、queryWrapper.ne()、queryWrapper.in()...，等等方法设置的值。(反射获取)
        HashMap hashMap = (HashMap)ReflectUtil.getFieldValue(queryWrapper, "paramNameValuePairs");
        Object value1 = hashMap.get("MPGENVAL1");
        Object value2 = hashMap.get("MPGENVAL2");
        System.out.println("value1：" + value1);
        System.out.println("value2：" + value2);

        // 修改完成的sql 再设置回去
        PluginUtils.MPBoundSql mpBoundSql = PluginUtils.mpBoundSql(boundSql);
        mpBoundSql.sql(originSql);
    }

}
